package org.yelongframework.json.gson;

import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 * Gson工具类
 * 
 * @since 1.0.0
 */
public final class GsonUtils {

	/** 默认使用的gson */
	private static final Gson gson = new Gson();

	// ==================================================构造器==================================================

	private GsonUtils() {
	}

	// ==================================================JSON转Map==================================================

	/**
	 * JSON字符串转换为Map
	 * 
	 * @param <K>  map key type
	 * @param <V>  map value type
	 * @param json JSON字符串
	 * @return map对象
	 */
	public static <K, V> Map<K, V> fromJsonToMap(String json) {
		return fromJsonToMap(gson, json);
	}

	/**
	 * JSON字符串转换为Map
	 * 
	 * @param <K>  map key type
	 * @param <V>  map value type
	 * @param gson gson实例
	 * @param json JSON字符串
	 * @return map对象
	 */
	public static <K, V> Map<K, V> fromJsonToMap(Gson gson, String json) {
		return fromJsonToMap(gson, json, Map.class);
	}

	/**
	 * JSON字符串转换为 map
	 * 
	 * @param <K>      map key type
	 * @param <V>      map value type
	 * @param json     JSON字符串
	 * @param mapClass map对象的类型
	 * @return map对象
	 */
	@SuppressWarnings("rawtypes")
	public static <K, V> Map<K, V> fromJsonToMap(String json, Class<? extends Map> mapClass) {
		return fromJsonToMap(gson, json, mapClass);
	}

	/**
	 * JSON字符串转换为Map
	 * 
	 * @param <K>      map key type
	 * @param <V>      map value type
	 * @param <M>      map type
	 * @param gson     gson
	 * @param json     JSON字符串
	 * @param mapClass map对象类型
	 * @return map对象
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static <K, V> Map<K, V> fromJsonToMap(Gson gson, String json, Class<? extends Map> mapClass) {
		return gson.fromJson(json, mapClass);
	}

	// ==================================================JSON转集合==================================================

	/**
	 * JSON字符串转换为 List
	 * 
	 * @param <T>  list elements type
	 * @param json JSON字符串
	 * @return list对象
	 */
	public static <T> List<T> fromJsonToList(String json) {
		return gson.fromJson(json, new TypeToken<List<Object>>() {
		}.getType());
	}

	/**
	 * JSON字符串转换为List
	 * 
	 * @param <T>  list elements type
	 * @param gson gson
	 * @param json JSON字符串
	 * @return list对象
	 */
	public static <T> List<T> fromJsonToList(Gson gson, String json) {
		return fromJsonToList(gson, json, List.class);
	}

	/**
	 * JSON字符串转换为List
	 * 
	 * @param <T>       list elements type
	 * @param json      JSON字符串
	 * @param listClass list对象类型
	 * @return list对象
	 */
	@SuppressWarnings({ "rawtypes" })
	public static <T> List<T> fromJsonToList(String json, Class<? extends List> listClass) {
		return fromJsonToList(gson, json, listClass);
	}

	/**
	 * JSON字符串转换为List
	 * 
	 * @param <T>       list elements type
	 * @param gson      gson
	 * @param json      JSON字符串
	 * @param listClass list对象类型
	 * @return list对象
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static <T> List<T> fromJsonToList(Gson gson, String json, Class<? extends List> listClass) {
		return gson.fromJson(json, listClass);
	}

}
